package san.java.day13;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * 随机存取流:
 *  RandomAccessFile 类支持 "随机访问" 的方式,程序可以直接跳到文件的任意位置来读写文件
 *      1. 支持只访问文件的部分内容
 *      2. 可以向已存在的文件后追加内容
 *
 *      记录指针: 用以标示当前读写处的位置:
 *          1. long getFilePointer(): 获取文件记录指针的当前位置
 *          2. void seek(long pos): 将文件记录指针定位到pos位置
 *
 *      构造函数:
 *          1. public RandomAccessFile(File file, String mode)
 *          2. public RandomAccessFile(File file, String mode)
 *
 *          mode:
 *              1. r
 *              2. rw
 *              3. rwd: 读写；并同步文件内容的更新
 *              4. rws: 读写；同步文件内容和元数据的更新
 *
 *
 *  流是用来处理数据的:
 *      1. 一定要明确数据源与数据的目的地
 *      2. 流只是在帮助数据进行传输,并对传输的数据进行处理,比如过滤转换等
 */

public class RandomAccessFile_07 {

    public static void testRandomAccessFile() throws IOException {
        RandomAccessFile ra = new RandomAccessFile("data/a1.txt", "rw");

        ra.seek(ra.length());  // 设置起始点
        // 注意: 如果是在中间和开头,将会覆盖数据

        String str = "hello world!\n";

        ra.writeChars(str);

        ra.writeDouble(1.0);

        ra.writeBytes(str);

        ra.seek(0);

        byte[] b = new byte[1024];

        int len = 0;

        while ((len = ra.read(b)) != -1) {
            System.out.println(new String(b, 0, len));
        }

        ra.close();

    }

    public static void main(String[] args) {
        try {
            testRandomAccessFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
